/**
 * 
 * @param {Array} tokens 
 * @returns 
 */
export default function nestTokens(tokens){
    const nestedTokens = []
    // 创建一个收集器， 这里利用js引用类型传递地址的特性，第一次进入程序的时候默认指向最外层的数组
    let collector = nestedTokens 
    const sections = [] // 栈
    for(let token of tokens){
        switch(token[0]){
            case '#':
                // 遇到 # 将当前token 添加到当前 收集器 指向的数组
                collector.push(token) 
                // 给当前数组增加下标为2的数据项，并指向一个空数组 ，并修改收集器的指向
                collector = token[2] = [] 
                // 并且向栈中推入当前token 当前正在处理的数据 一定是栈顶的数据
                sections.push(token) 
                break;
            case '/':
                // 遇到 / 字符 代表当前收集器内的数据处理完毕 将栈顶的数据弹出
                sections.pop() 
                // 判断栈里还有没有数据 如果有 将收集器指向栈顶数据下标2的数组 没有则指向最外层的数据
                collector = sections.length > 0 ? sections[sections.length-1][2] : nestedTokens; 
                break;
            default:
                collector.push(token) // 将非 # / 字符的token 推入到当前收集器指向的地址 成为他的子项
            
        }
    }
    return nestedTokens
}